package collection;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

/**
 * 集合的遍历：
 * 1.Collection接口提供了统一的遍历集合的方式：迭代器模式
 * 2.通过集合的iterator()方法可以获取一个遍历当前集合的迭代器（Iterator接口）
 * 3.Iterator接口：定义了迭代器遍历集合的相关操作，不同集合提供了不同的迭代器实现类
 *      但我们无需记住，只需要从多态的角度吧他们看成Iterator即可
 * 4.迭代器遍历遵循的步骤为：问（hasNext（））、取（next（））
 */
public class IteratorDemo {
    public static void main(String[] args) {
        Collection<String> c = new ArrayList<>();
        c.add("one");
        c.add("#");
        c.add("two");
        c.add("#");
        c.add("three");
        c.add("#");
        c.add("four");
        c.add("#");
        c.add("five");
        System.out.println(c);  //[one, #, two, #, three, #, four, #, five]

        //集合什么类型得到什么类型的迭代器

        /*
        迭代器的常用方法：
        1)boolean hasNext():--------------问（必要操作）
            询问集合是否还有“下一个”元素可供迭代
            注意：迭代器默认开始位置为集合的第一个元素之前
                无论调用了多少次hasNext（）,迭代器的位置都不会改变
         2)E next():------------------------取(必要操作)
             迭代器向后移动一个位置并将该位置的元素取出
         3)void remove()--------------------删(删除并非必要操作)
           删除next()方法所获取的元素

         */
        Iterator<String> it = c.iterator();  //获取集合c的迭代器
        while (it.hasNext()){    //若有下一个元素
            String str = it.next();  //向后移动一个位置并获取对应的元素
            System.out.println(str);

            if("#".equals(str)){  //String的默认值为null,为防止报空指针异常，将所需要删的东西“#”，放前去进行判断
                //  c.remove(str);  //迭代器遍历过程中不允许通过集合的方式来增删元素，否则会报异常
                it.remove();  //删除next（）方法所获取的元素
            }
        }
        System.out.println(c);


    }
}
